#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
const int N=2*1e5+10;

struct node{
	int x,y,k;
};
vector<node> query;
unordered_map<int,int> has;
int t,pos;
int f[N];

int Find(int x)
{
	if(x!=f[x])
	{
		f[x]=Find(f[x]);
	}
	return f[x];
}
int get(int x)
{
	if(!has.count(x))
	{
		has[x]=pos++;
	}
	return has[x];
}
int main()
{	
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		pos=0;
		for(int i=0;i<n;i++)
		{
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			query.push_back({get(x),get(y),z});
		}
		
		for(int i=0;i<pos;i++)
		{
			f[i]=i;
		}
		bool flg=true;
		for(int i=0;i<query.size();i++)
		{
			if(query[i].k==1)
			{
				int x=query[i].x;
				int y=query[i].y;
				x=Find(x),y=Find(y);
				if(x!=y)
				{
					f[x]=y;
				}
			}
		}
		for(int i=0;i<query.size();i++)
		{
			if(query[i].k==0)
			{
				int x=query[i].x;
				int y=query[i].y;
				x=Find(x),y=Find(y);
				if(x==y)
				{
					flg=false;
					break;
				}
			}
		}		
		if(flg)
		{
			cout<<"YES"<<endl;
		}
		else{
			cout<<"NO"<<endl;
		}
		has.clear();
		query.clear();
	}
		
	return 0;
}
